from collections import OrderedDict
from goods.models import GoodsChannel

def get_categories():

    # 准备商品分类对应的字典 为了兼容python3.7版本以前的无序字典，这里声明是一个有序大字典
    categories = OrderedDict()
    # 查询所有的商品频道：37个一级类别
    channels = GoodsChannel.objects.all().order_by('group_id', 'sequence')
    for channel in channels:
        # 遍历所有频道
        # 找到每个频道对应的频道组： 只有11组
        group_id = channel.group_id
        # 接下来的思想很重要， 如果每次用channel 查出组Id 然后查出这组的所有channel 那么 for 循环会循环37次，其中有 26次是白循环  所以改变思维，每次循环都把主句整体做一遍 ---》 每循环一次channel 就把对应的二级， 三级数据重构出来，这样就可以节约成本
        # 第一层数据构造完成  需要判断是否group_id 键是否存在，如果存在就不添加 只追加数据，如果不存在就创建然后追加数据
        if group_id not in categories:
            categories[group_id] = {'channels': [], 'sub_cats': []}

        # 查询当前频道对应的一级类别 就是频道列表和商品类别类的一对一复刻  这里应该是为了方便后续查询做的此步操作
        cat1 = channel.category
        # 将cat1 添加到第二层数据channels中 但是缺少url数据  还得利用channel
        categories[group_id]['channels'].append({
            "id": cat1.id,
            "name": cat1.name,
            "url": channel.url
        })
        # 查询二级和三级数据
        # 二级 一查多  related_name 查询
        for cat2 in cat1.subs.all():
            cat2.sub_cats = []  # 根据数据结构  二级中也有存放三级的列表，但cat2类模型中 没有相应的空字典，所以这里天假上
            for cat3 in cat2.subs.all():  # 从二级类别找三级类别
                cat2.sub_cats.append(cat3)

            # 每次二级、三级塑造好后，要添加到一级类别的sub_cats中
            categories[group_id]['sub_cats'].append(cat2)
    """ 
    需要重构的数据结构
    {
        "1":{
            "channels":[
                {"id":1, "name":"手机", "url":"http://shouji.jd.com/"},
                {"id":2, "name":"相机", "url":"http://www.itcast.cn/"}
            ],
            "sub_cats":[
                {
                    "id":38, 
                    "name":"手机通讯", 
                    "sub_cats":[
                        {"id":115, "name":"手机"},
                        {"id":116, "name":"游戏手机"}
                    ]
                },
                {
                    "id":39, 
                    "name":"手机配件", 
                    "sub_cats":[
                        {"id":119, "name":"手机壳"},
                        {"id":120, "name":"贴膜"}
                    ]
                }
            ]
        },
        "2":{
            "channels":[],
            "sub_cats":[]
        }
    }
    """
    return categories